/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util.validation;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import modelo.CriterioBusqueda;
import util.validation.annotation.Filter;

/**Sabe leer un formulario de busqueda y obtener de el los criterios de busqueda
 * ingresados por el usuario
 *
 * @author raul
 */
public class CreadorCriterios extends GestorValidacion {
    private List<CriterioBusqueda> criterios;
    
    /**Lee el formulario y crea criterios de busqueda con los metodos anotados
     * con @Filter obteniendo el nombre del filtro a partir del nombre del metodo
     * y el valor del filtro del contenido del componente que devuelve el metodo
     * 
     * @param formulario 
     */
    public void crearCriterios(Object formulario) {
        criterios = new ArrayList<CriterioBusqueda>();
        
        //1- Para cada metodo en el formulario
        for (Method m : formulario.getClass().getDeclaredMethods()){
            //1.1. el metodo tiene la anotacio @Filter?
            if (m.isAnnotationPresent(Filter.class)) {
                //1.1.1 obtener el componente y crear el validador correspondiente
                IValidador validador = super.crearValidador(super.invocarMetodo(m, formulario));
                //1.1.2 No esta vacio el campo?
                if (!validador.devuelveVacio()) {
                    //1.1.2.1 crea un nuevo criterio de busqueda a partir del nombre del
                    //metodo y el valor contenido en el componente
                    criterios.add(new CriterioBusqueda(
                            super.obtenerNombreCampo(m.getName()),
                            validador.getValor()));
                }
            }
        }
    }
    
    /**Indica si el usuario no ingreso ningun valor en el formulario de busqueda
     * en ninguno de los campos
     * 
     * @return true si no se especifico ningun criterio de busqueda
     */
    public boolean isFormularioVacio(){
        return criterios.isEmpty();
    }
    
    public CriterioBusqueda [] getCriterios() {
        return criterios.toArray(new CriterioBusqueda[0]);
    }
}
